package com.dhcc.cdc.util;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.dhcc.cdc.nlp.cache.schemadic.NlpSchemaDicCache;
import com.dhcc.cdc.nlp.entity.NlpSchemaDicEntity;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.List;

/**
 * @author :WuJiaFeng
 * @version :1.0
 * @description :调用东华语义分析接口
 * @date :2019年8月21日
 */
public class DHCAI {
    protected final static Logger logger = LoggerFactory.getLogger(DHCAI.class);

    /**
     * @param path 接口地址
     * @param data 文本内容
     * @param type 检查exam 电子病历为emr
     * @description :调用东华语义分析接口
     * @author :WuJiaFeng
     * @date :2019年8月21日
     * @version :1.0
     */
    public static JSONArray parse(String path, String data) {
        JSONArray resultArr = new JSONArray();

        try {
            data = "data=" + URLEncoder.encode(data, "UTF-8");
            URL url = new URL(path);
            // 打开和url之间的连接
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            //System.err.println("getResponseCode:"+conn.getResponseCode());
            PrintWriter out = null;
            // 请求方式
            conn.setRequestMethod("POST");
            //设置通用的请求属性
            conn.setRequestProperty("accept", "*/*");
            conn.setRequestProperty("connection", "Keep-Alive");
            conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");
            // 设置是否向httpUrlConnection输出，设置是否从httpUrlConnection读入，此外发送post请求必须设置这两个
            // 最常用的Http请求无非是get和post，get请求可以获取静态页面，也可以把参数放在URL字串后面，传递给servlet，
            // post与get的 不同之处在于post的参数不是放在URL字串里面，而是放在http请求的正文内。
            conn.setDoOutput(true);
            conn.setDoInput(true);
            //conn.setConnectTimeout(5000);
            //conn.connect();

            // 获取URLConnection对象对应的输出流
            out = new PrintWriter(conn.getOutputStream());
            // 发送请求参数即数据
            out.print(data);
            // 缓冲数据
            out.flush();
            // 获取URLConnection对象对应的输入流
            InputStream is = conn.getInputStream();
            // 构造一个字符流缓存
            BufferedReader br = new BufferedReader(new InputStreamReader(is, "UTF-8"));
            StringBuffer sb = new StringBuffer("");
            String str = "";
            while ((str = br.readLine()) != null) {
                sb.append(str);
            }
            //System.out.println("sb:"+sb);
            //System.err.println("getResponseCode:"+conn.getResponseCode());
            // 关闭流
            is.close();
            br.close();
            out.close();
            // 断开连接，最好写上，disconnect是在底层tcp socket链接空闲时才切断。如果正在被其他线程使用就不切断。
            // 固定多线程的话，如果不disconnect，链接会增多，直到收发不出信息。写上disconnect后正常一些。
            conn.disconnect();
            resultArr = parseSection(sb);
        } catch (Exception e) {
            e.printStackTrace();
        }

        return resultArr;
    }


    /**
     * @param sb
     * @Description：对结果进行拆解加工
     * @Author wujiafeng
     * @Date:2019年8月21日下午1:56:00
     */
    private static JSONArray parseSection(StringBuffer sb) {
        JSONArray resultArr = new JSONArray();
        JSONArray array = new JSONArray();
        try {
            array = JSONArray.parseArray(sb.toString());
        } catch (Exception e) {
            logger.error(e.getMessage());
        }

        for (int i = 0; i < array.size(); i++) {
            JSONObject resultObj = new JSONObject();
            JSONObject obj = array.getJSONObject(i);

            String objType = obj.getString("type"); // 类型
            String objName = obj.getString("name"); // 解析内容
            String sectionType = obj.getString("section_type"); // 段落分类
            String objCore = obj.getString("core"); // 核心词

            // 获取系统内schema字典表内维护信息
            NlpSchemaDicEntity parentSchema = NlpSchemaDicCache.me().getSchemeByCode(objType);
            // 如果当前解析类型设置为无效，跳过
            if (parentSchema == null||parentSchema.getIsActive() != 1) {
                continue;
            }
            resultObj.put("type", objType);
            resultObj.put("name", objName);
            resultObj.put("section_type", sectionType);
            resultObj.put("core", objCore);
            // 获取当前解析类型详细schema
            List<NlpSchemaDicEntity> sonSchemaList = NlpSchemaDicCache.me().getSchemeListByPid(parentSchema.getId());
            for (NlpSchemaDicEntity sonSchema : sonSchemaList) {
                // 只取生效的子schema
                if (sonSchema.getIsActive() == 1) {
                    resultObj.put(sonSchema.getKeyCode(), JSON.parse(obj.getString(sonSchema.getKeyCode())));
                }
            }
            resultObj.put("index", JSON.parse(obj.getString("index")));
            resultArr.add(resultObj);
        }
        return resultArr;
    }

    public static void main(String[] args) {
        System.err.println("++++++测试东华语义分析+++++++++++");
        String ADD_URL = "http://10.1.20.118:1223/tag";
        String data = "下肢静脉血栓，考虑心肌梗死所致";
        //Map<String, Object> resultMap = DHCAI.parse(ADD_URL,data,"首次病程记录","入院诊断");
        JSONArray parse = DHCAI.parse(ADD_URL, data);
        System.out.println(parse);

    }
}
